package com.dxf.chepter09

/**
 * 操作原理 : 类似正则表达式
 *
 * 联系1
 *  现在有一些商品,请使用scala设计相关样例类,完成商品的捆绑打折出售,要求:
 *    1 商品捆绑可以是单个商品或者多个商品
 *    2 打折时按照折扣x元进行设计
 *    3 能够统计出所有捆绑商品打折后的最终价格
 *
 */
object T119_匹配嵌套结构 {


  def main(args: Array[String]): Unit = {

    //数据
    //description = 书籍
    //discount = 10
    //item =  Book("漫画", 40),  Bundle("文学作品", 20, Book("阳关", 80), Book("围城", 30))
    //分析 : 单本 漫画:  40 -10 =30
    //文学作品           80+30-20 + 30(漫画) =120
    val sale = Bundle("书籍", 10, Book("漫画", 40), Bundle("文学作品", 20, Book("阳关", 80), Book("围城", 30)))


    //1 使用case语句得到数据 漫画
    val description: String = sale match {
      case Bundle(_, _, Book(description, _), _*) => description
    }
    println(description)

    //2 @表示法 语法:  xxx @类名 匹配改类 或者 xxx @_ 匹配所有
    val result2 = sale match {
      case Bundle(_, _, art @Book(description, price), rest @_*) => (art, rest)
    }
    println(result2)

    //3 如果只想绑定一个Bundle,可以把* 去掉
    val result3 = sale match {
      case Bundle(_, _, art @Book(description, price), rest @_) => (art, rest)
    }
    println(result3)

    //4 自己动手写了
     println(price(sale))





  }

  def price(it:Item) :BigDecimal ={
    it match {
      case Book(_,p) =>p
      case Bundle(_,disc, its @_*) => its.map(price _).sum -disc
    }
  }


}


abstract class Item

case class Book(description: String, price: BigDecimal) extends Item

case class Bundle(description: String, discount: BigDecimal, item: Item*) extends Item




